/*
 * @Description: 泛型接口
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2021-05-06 18:35:53
 * @LastEditTime: 2021-05-20 15:10:33
 */

/**
 * 泛型接口约束class类 
 * T为User对象类型
 */
interface iUser<T> {
    data: T[] //User表（数组）
    saveUser: (user: T) => T //存储用户
    getUserById: (id: number) => T | void//通过ID查询用户
}

class User {
    id?: number
    name: string
    age: number
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
}

/**
 * @description: 用户创建和查询类 
 * @param {*}
 * @return {*}
 * @author: HuiSir
 */
class UserApi implements iUser<User>{
    data: User[] = [] //初始化为空数组
    saveUser(user: User): User {
        // 创建不重复id
        user.id = Date.now() + Math.floor(Math.random() * 1000)
        this.data.push(user)
        return user
    }
    // 由于查询可能查不到，所以可能返回为undefined
    getUserById(id: number): User | void {
        return this.data.find(user => user.id === id)
    }
}

let userApi = new UserApi()
// 没有数据的情况
console.log(userApi.getUserById(1)) //undefined

// 添加用户
userApi.saveUser(new User("张三", 11))
const { id } = userApi.saveUser(new User("李四", 13))
userApi.saveUser(new User("王五", 15))

// 查看数据
console.log(userApi.data, id)
// [
//     User { name: '张三', age: 11, id: 1621259466267 },
//     User { name: '李四', age: 13, id: 1621259466455 },
//     User { name: '王五', age: 15, id: 1621259466528 }
// ]
// id: 1621259466455

// 查询用户ById
// 这里在严格模式下id可能为undefined,而getUserById的参数时number,所以要加！断言
// 在非严格模式下不会无须断言
console.log(userApi.getUserById(id!)) //User { name: '李四', age: 13, id: 1621259618344 }